package com.yangxf.c_processInstance;

import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class ProcessInstanceTest {

	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**
	 * 部署流程定义
	 */
	@Test
	public void deploymentProcessDefinition_zip() {
		
		InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloword.zip");
		
		ZipInputStream zipInputStream = new ZipInputStream(in);
		
		Deployment deployment = processEngine.getRepositoryService() // 流程定义、部署对象 所使用的service
				.createDeployment() // 创建部署对象
				.name("我的流程定义") // 输入框 部署名称
				.addZipInputStream(zipInputStream) // 指定zip完成部署
				.deploy(); // 完成部署
		
		System.out.println("部署id："+deployment.getId());
		System.out.println("部署名称："+deployment.getName());
	}
	
	/**
	 * 启动流程实例
	 */
	@Test
	public void startProcessInstance() {
		
		String processDefinitionKey = "helloworld";
		
		ProcessInstance pi = processEngine.getRuntimeService() // 与正在执行的流程实例和执行对象相关的service
			.startProcessInstanceByKey(processDefinitionKey); // 使用流程定义的key启动流程实例，key对应helloworld.bpmn文件中id属性的值
		 
		System.out.println("流程实例id："+pi.getId()); // 流程实例id 25001
		System.out.println("流程定义id："+pi.getProcessDefinitionId()); // 流程定义id helloworld:5:22504
	}
	
	/**
	 * 查询当前的个人任务
	 */
	@Test
	public void findMyOwnTask() {
		
		String name = "王五";
		
		List<Task> list = processEngine.getTaskService() // 与正在执行的任务管理相关的service
			.createTaskQuery() // 创建任务查询对象
			.taskAssignee(name) // 个人任务查询指定 查询人
//			.taskCandidateUser() // 组任务办理人查询
//			.processDefinitionId() // 使用流程定义id查询
//			.processInstanceId() // 使用流程实例id查询
//			.executionId() // 使用执行对象id查询
//			.singleResult() // 返回唯一记录
//			.count() // 返回结果集的数量
//			.listPage(, ) // 分页查询
			.list(); // 
		
		if(list!=null && list.size()>0) {
			for(Task task:list) {
				System.out.println("任务id："+task.getId());
				System.out.println("任务名称："+task.getName());
				System.out.println("任务创建时间："+task.getCreateTime());
				System.out.println("任务办理人："+task.getAssignee());
				System.out.println("流程实例id："+task.getProcessInstanceId());
				System.out.println("执行对象id："+task.getExecutionId());
				System.out.println("流程定义id："+task.getProcessDefinitionId());
			}
		}
	
	}
	
	/**
	 * 完成我的任务
	 */
	@Test
	public void finishMyTask() {
		
		String taskId = "30002";
		
		processEngine.getTaskService() // 正在执行的任务使用的service
			.complete(taskId);
		
		System.out.println("完成任务：任务id是："+taskId);
	}
	
	/**
	 * 查询流程状态（判断流程是执行还是结束）
	 */
	@Test
	public void isProcessEnd() {
		
		String processInstanceId = "25002";
		ProcessInstance pi = processEngine.getRuntimeService() // 正在执行的流程实例和执行对象
			.createProcessInstanceQuery()
			.processInstanceId(processInstanceId)
			.singleResult(); // 结果集返回单个对象
		
		if(pi==null) {
			System.out.println("流程已经结束");
		}else {
			System.out.println("流程未结束");
		}
	}
	
	/**
	 * 查询历史记录
	 */
	@Test
	public void findHistoryTask() {
		
		String taskAssignee = "李四";
		
		List<HistoricTaskInstance> list = processEngine.getHistoryService() // 与历史数据相关的service
			.createHistoricTaskInstanceQuery() // 创建历史任务实例查询
			.taskAssignee(taskAssignee) // 指定历史任务办理人
			.list();
		
		if(list!=null && list.size()>0) {
			for(HistoricTaskInstance hti:list) {
				System.out.println(hti.getId()+" "+hti.getName()+" "+hti.getProcessInstanceId()+" "
						+hti.getStartTime()+" "+hti.getEndTime()+" "+hti.getDurationInMillis());
				System.out.println("=========================================================");
			}
		}
	}
	
	/**
	 * 查询历史流程实例
	 */
	@Test
	public void findHistoryProcessInstance() {
		String processInstanceId = "25001";
		
		HistoricProcessInstance hpi = processEngine.getHistoryService() // 与历史表相关的service
			.createHistoricProcessInstanceQuery() // 创建历史流程实例查询
			.processInstanceId(processInstanceId) // 使用流程实例id查询
			.singleResult(); // 
		System.out.println(hpi.getId() + " " + hpi.getProcessDefinitionId() + " " + hpi.getStartTime() + " " + hpi.getEndTime() + " " + hpi.getDurationInMillis());
	}
}
